//
// Created by bbnf on 09.06.2024.
//

#include "storage_pch.h"


namespace TodoApp::Storage {
    TodoStorage::TodoStorage(const std::vector<Todo*> &todos)
            : m_todos(todos) {

    }

    auto TodoStorage::todos() -> std::vector<Todo*> {
        auto todos = std::vector<Todo*>({});
        auto priority = Todo::Low;
        switch (m_filter) {
            case OnlyDone:
                std::copy_if(m_todos.begin(), m_todos.end(), std::back_inserter(todos), [](auto todo) {
                    return todo->done();
                });
                break;
            case LowPriority:
                priority = Todo::Low;
                break;
            case MediumPriority:
                priority = Todo::Medium;
                break;
            case HighPriority:
                priority = Todo::High;
                break;
            default: // All todos
                return m_todos;
        }
        std::copy_if(
                m_todos.begin(), m_todos.end(),
                std::back_inserter(todos),
                [priority](auto todo) {
                    return todo->priority() == priority;
                }
        );
        return todos;
    }

    void TodoStorage::setFilter(TodoStorage::TodoFilter filter) {
        m_filter = filter;
    }

    void TodoStorage::clearFilter() {
        setFilter(All);
    }

    auto TodoStorage::todos(TodoStorage::TodoFilter filter) -> std::vector<Todo*> {
        setFilter(filter);
        return todos();
    }

    TodoStorage::~TodoStorage() {
       for(auto *t : m_todos) {
           delete t;
       }
    }
}  // namespace TodoApp::Storage
